/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import clases.Articulo;
import clases.Asignatura;
import clases.Autor;
import clases.EstadoArticulo;
import clases.Seccion;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.struts.upload.FormFile;
import org.hibernate.Query;
import org.hibernate.Session;
import utilidades.GenerarCadenaAlfanumerica;

/**
 *
 * @author Rafa
 */
public class DAO_Articulo {

    Session sesion = null;

    public DAO_Articulo() {
        this.sesion = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public List<Articulo> consultaArticulos(boolean iniciar) {
        List<Articulo> listaArticulos = new ArrayList();
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se realiza la consulta
            Query q = sesion.createQuery("from Aritculo");

            //Se recoge el resultado de la consulta
            listaArticulos = (List<Articulo>) q.list();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return listaArticulos;
    }

    public Articulo consultaArticulo(int idArticulo, boolean iniciar) {
        Articulo articulo = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("from Articulo where idArticulo = '" + idArticulo + "'");
        //query.setParameter("idArticulo", idArticulo);

            //Se recoge el resultado de la consulta
            articulo = (Articulo) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return articulo;
    }

    public Articulo consultaArticuloPorTitulo(String titulo, boolean iniciar) {
        Articulo articulo = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("from Articulo where titulo = '" + titulo + "'");
        //query.setParameter("idArticulo", idArticulo);

            //Se recoge el resultado de la consulta
            articulo = (Articulo) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return articulo;
    }

    public Articulo insertaArticulo(Seccion seccion, String keywords, Asignatura asignatura, String titulo, String tema, FormFile PDF, String ubicacionWebInf, boolean iniciar) {
        Articulo articulo = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            String codigoVerEstado = GenerarCadenaAlfanumerica.getCadena(16);

            DAO_EstadoArticulo daoEstadoArticulo = new DAO_EstadoArticulo();
            EstadoArticulo estado = daoEstadoArticulo.consultaEstadoArticulo(Constantes.getART_SUBIDO(), true);
            //(Seccion seccion, EstadoArticulo estadoArticulo, Asignatura asignatura, String titulo, boolean destacado, int votacion, String tema, String codigoVerEstado, String keywords)
            articulo = new Articulo(seccion, estado, asignatura, titulo, false, 0, tema, codigoVerEstado, keywords);

            sesion.save(articulo);

            /*Se guarda el articulo en el directorio indicado*/
            guardarFichero(PDF, articulo, ubicacionWebInf);

            sesion.getTransaction().commit();
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();

        }
        return articulo;
    }

    public boolean eliminaArticulo(int idArticulo, boolean iniciar) {
        boolean correcto = false;
        try {
            if (iniciar) {
                sesion.beginTransaction();
                sesion.delete(consultaArticulo(idArticulo, false));
            }else{
                sesion.delete(consultaArticulo(idArticulo, true));
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            
            sesion.getTransaction().commit();
            correcto = true;
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();

        }
        return correcto;
    }
    
    public boolean modificaEstadoArticulo(int idArticulo, String estado, boolean iniciar) {
        boolean correcto = false;
        try {
            Articulo articulo = null;
            if (iniciar) {
                sesion.beginTransaction();
                articulo = consultaArticulo(idArticulo, iniciar);
            } else {
                articulo = consultaArticulo(idArticulo, iniciar);
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            articulo.getEstadoArticulo().setEstado(estado);

            sesion.saveOrUpdate(articulo);
            sesion.getTransaction().commit();
            correcto = true;
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();
        }

        return correcto;
    }

    public void guardarFichero(FormFile PDF, Articulo articulo, String ubicacionWebInf) {
        FileOutputStream fop = null;
        File file;

        try {
            String rutaCarpetaArticulos = ubicacionWebInf + Constantes.getSEPARATOR()
                    + Constantes.getCARPETA_DATOS()
                    + Constantes.getSEPARATOR() + Constantes.getCARPETA_ARTICULOS();

            String nombrePDF = rutaCarpetaArticulos
                    + Constantes.getSEPARATOR() + articulo.getIdArticulo() + ".pdf";
            /*Se comprueba si el directorio existe y si no existe se crea*/
            File directorio = new File(rutaCarpetaArticulos);
            if (!directorio.exists()) {
                if (directorio.mkdir()) {
                }
            }

            /*Se procede a subir el fichero*/
            file = new File(nombrePDF);
            fop = new FileOutputStream(file);

            // if file doesnt exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }

            // get the content in bytes
            byte[] fileData = PDF.getFileData();
            fop.write(fileData);
            fop.flush();
            fop.close();

            /*String contentType = PDF.getContentType();
             String fileName = PDF.getFileName();
             int fileSize = PDF.getFileSize();
             byte[] fileData = PDF.getFileData();*/
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fop != null) {
                    fop.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
